package main

import (
	"fmt"
	"sync"
	"time"
)

var numMap map[int]int = make(map[int]int)

// 互斥锁
var lock sync.Mutex

// factorial
//
//	@Description: 求和，结果放入map中
//	@param n
//
// 多个协程操作同一个map，会出现并发问题，这里使用互斥锁解决并发问题！
func sum(n int) {
	res := 0
	for i := 1; i <= n; i++ {
		res += i
	}
	lock.Lock() //加锁
	numMap[n] = res
	lock.Unlock() //解锁
}

func main() {
	//开启多个协程计算
	for i := 1; i <= 100; i++ {
		go sum(i)
	}

	//休眠10秒,等待协程执行完毕
	time.Sleep(time.Second * 10)
	lock.Lock() //加锁
	for k, v := range numMap {
		fmt.Printf("map[%d]=%d\n", k, v)
	}
	lock.Unlock() //解锁
	//fatal error: concurrent map writes
}
